<?php

class Tabela {

    private $nomeTabela;    /* Nome da Tabela           */
    private $campos;        /* array Nomes dos campos   */
    private $tipos;         /* array Tipos dos campos   */
    private $nulls;         /* array Aceita Null        */
    private $keys;          /* array Tipos de chaves    */
    private $defaults;      /* array Default            */
    private $extras;        /* array Auto_increment     */
    private $nomeTipoCampo;
    private $tamanhoTipoCampo;

    function __construct($nomeTabela) {
        $this->setNomeTabela($nomeTabela);

        if ($GLOBALS['banco'] == 'mssql') {
            $sql = 'SELECT column_name, data_type, ';
            $sql .= 'IS_NULLABLE FROM INFORMATION_SCHEMA.COLUMNS ';
            $sql .= 'WHERE table_name=' . "'" . $nomeTabela . "'" . ' AND (domain_name NOT LIKE ' . "'" . '%_autonum' . "' ";
            $sql .= 'OR domain_name IS NULL) ORDER BY ordinal_position';
            $campos = mssql_query($sql);
            while ($row = mssql_fetch_array($campos)) {
                $this->addCampo(strtolower($row['column_name']));     /* Nome do campo */
                $this->addTipo($row['data_type']);     /* Tipo do campo */
                $this->addNull($row['IS_NULLABLE']);     /* Aceita Null */

                $this->addDefault('');     /* default */

                $this->addNomeTipoCampo($row['data_type']);
            }

            $sql = 'exec sp_columns ' . $nomeTabela;
            $resultado = mssql_query($sql);
            while ($row = mssql_fetch_array($resultado)) {
                $autoincremento = $row['TYPE_NAME'] == 'int identity' ? 'auto_increment' : '';
                $this->addExtra($autoincremento);     /* auto_increment */

                $chave = $row['IS_NULLABLE'] == 'NO' ? 'PRI' : '';
                $this->addKey($chave);     /* Tipo de chave */

                if ($row['TYPE_NAME'] == 'nvarchar') {
                    $numCaracteres = $row['PRECISION'];
                } else {
                    if ($row['TYPE_NAME'] != 'datetime') {
                        $numCaracteres = $row['LENGTH'];
                    } else {
                        $numCaracteres = 8;
                    }
                }

                $this->addTamanhoTipoCampo($numCaracteres);
            }
        } else {
            if ($GLOBALS['banco'] == 'mysql') {
                $sql = 'SHOW FULL FIELDS FROM ' . $nomeTabela;
                $campos = mysql_query($sql);
                while ($row = mysql_fetch_array($campos)) {
                    $this->addCampo($row['Field']);     /* Nome do campo */
                    $this->addTipo($row['Type']);     /* Tipo do campo */
                    $this->addNull($row['Null']);     /* Aceita Null */
                    $this->addKey($row['Key']);     /* Tipo de chave */
                    $this->addDefault($row['Default']);     /* default */
                    $this->addExtra($row['Extra']);     /* auto_increment */

                    $this->addNomeTipoCampo($row['Type']);
                    $this->addTamanhoTipoCampo($row['Type']);
                }
            } else {
                echo '<h1>Erro: Nao foi possivel criar o objeto DataBase.<br>Erro na linha 36 do arquivo /classes/DataBase.inc</h1>';
            }
        }
    }

    public function setNomeTabela($nomeTabela) {
        $this->nomeTabela = strtolower($nomeTabela);
    }

    public function getCampos() {
        return $this->campos;
    }

    public function addCampo($campo) {
        $this->campos[] = $campo;
    }

    public function addTipo($tipo) {
        $this->tipos[] = $tipo;
    }

    public function addNull($null) {
        $this->nulls[] = $null;
    }

    public function addKey($key) {
        $this->keys[] = $key;
    }

    public function addDefault($default) {
        $this->defaults[] = $default;
    }

    public function addExtra($extra) {
        $this->extras[] = $extra;
    }

    public function addNomeTipoCampo($nomeTipoCampo) {
        if (strpos($nomeTipoCampo, '(') == 0) {
            $this->nomeTipoCampo[] = $nomeTipoCampo;
        } else {
            $this->nomeTipoCampo[] = substr($nomeTipoCampo, 0, strpos($nomeTipoCampo, '('));
        }
    }

    public function addTamanhoTipoCampo($tamanhoTipoCampo) {
        if (strpos($tamanhoTipoCampo, '(') == 0) {
            $this->tamanhoTipoCampo[] = '';
        }
        /*
          else
          {
          $this->tamanhoTipoCampo[] = (integer)substr($tamanhoTipoCampo,
          strpos($tamanhoTipoCampo,
          '(')+1,
          (strpos($tamanhoTipoCampo, ')') - 1 - (strpos($palavra, '(')))
          );
          } */
    }

    public function getNomeTabela() {
        return $this->nomeTabela;
    }

    public function getCampo($i) {
        return $this->campos[$i];
    }

    public function getTipo($i) {
        return $this->tipos[$i];
    }

    public function getNull($i) {
        return $this->nulls[$i];
    }

    public function getKey($i) {
        return $this->keys[$i];
    }

    public function getDefault($i) {
        return $this->defaults[$i];
    }

    public function getExtra($i) {
        return $this->extras[$i];
    }

    public function getNomeTipoCampo($i) {
        return $this->nomeTipoCampo[$i];
    }

    public function getTamanhoTipoCampo($i) {
        return $this->tamanhoTipoCampo[$i];
    }

}

?>